#include <stdio.h>
#include "../quickjs.h"

#define JS_INIT_MODULE js_init_module
#define countof(x) (sizeof(x) / sizeof((x)[0]))

// 函数的原型
// typedef JSValue JSCFunction(JSContext *ctx, JSValueConst this_val, int argc, JSValueConst *argv);
// ctx       上下文
// this_val  模块
// argc      接受的js参数格式
// argv      接受的js参数
static JSValue test_fun(
    JSContext *js_ctx, JSValueConst this_val,
    int argc, JSValueConst *argv)
{
    printf("hello c");
    return JS_UNDEFINED;
}

// 执行js的函数
static JSValue eval_js_func(
    JSContext *js_ctx, JSValueConst this_val,
    int argc, JSValueConst *argv)
{
    if (!JS_IsFunction(js_ctx, argv[0]))
    {
        printf("eval_js_func: no fun");
        return JS_UNDEFINED;
    }

    return JS_Call(js_ctx, argv[0], this_val, argc - 1, argv + 1);
}
// 注册一个函数

// 1 函数列表
static const JSCFunctionListEntry js_test_funcs[] = {
    /* JS_CFUNC_DEF(函数入口名称，入参个数，QuickJS C 函数) */
    JS_CFUNC_DEF("test_fun", 0, test_fun),
    JS_CFUNC_DEF("eval_js_func", 2, eval_js_func),
};

// 2 函数注册
static int js_test_init(JSContext *ctx, JSModuleDef *m)
{
    return JS_SetModuleExportList(
        ctx, m,
        js_test_funcs, countof(js_test_funcs));
}

// 3 模块导出
#define JS_INIT_MODULE js_init_module
JSModuleDef *JS_INIT_MODULE(JSContext *ctx, const char *module_name)
{
    JSModuleDef *m;
    m = JS_NewCModule(ctx, module_name, js_test_init);
    if (!m)
        return NULL;
    JS_AddModuleExportList(ctx, m, js_test_funcs, countof(js_test_funcs));
    return m;
}